然后从诺言中返回


118

我有这样的JavaScript代码:

function justTesting() {
  promise.then(function(output) {
    return output + 1;
  });
}

var test = justTesting();

对于var测试,我总是有一个未定义的值。我认为这是因为承诺尚未解决..有一种方法可以从承诺中返回价值吗?


21
then()调用的返回值再次是一个Promise,它包装了您返回的值。
锡尔科

您有语法错误,我什至不解析。
djechlin

4
test未定义,因为justTesting在您的示例中不返回任何内容(您没有返回值)。添加退货并将测试定义为承诺。
杰罗姆·瓦格纳

1
感谢您的反馈。重点是分配输出+1进行测试。
Priscy

4
什么是变量promise。您不会在任何地方显示它的定义,也不会从justTesting()函数中返回任何内容。如果您需要更好的帮助,则需要描述您要解决的问题,而不仅仅是向我们展示非常“过时”的代码,甚至无法说明您实际上在试图做什么。解释您要解决的问题。
jfriend00 2015年

Answers:


136

当您从then()回调返回某些内容时,这有点不可思议。如果返回一个值,then()则使用该值调用下一个。但是,如果您返回类似承诺的内容,则下一个then()等待它,并且仅在该承诺成立(成功/失败)时才被调用。

来源:https//developers.google.com/web/fundamentals/getting-started/primers/promises#queuing-asynchronous-actions


似乎是因为这个原因,那么我可以遍历数组与阿贾克斯做承诺链要求同步在stackoverflow.com/q/53651266/2028440
砰力丸

82
没有回答这个问题。
安德鲁(Andrew)

相关链接
Marinos

1
那么解决方案是什么?
阿普尔瓦

58

要使用承诺,您必须调用一个创建承诺的函数,或者您必须自己创建一个函数。您并没有真正描述您要真正解决的问题,但是您可以自己创建承诺:

function justTesting(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

justTesting(29).then(function(val) {
   // you access the value from the promise here
   log(val);
});

// display output in snippet
function log(x) {
    document.write(x);
}

或者,如果您已经有一个返回承诺的函数,则可以使用该函数并返回其承诺:

// function that returns a promise
function delay(t) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, t);
  });
}

function justTesting(input) {
  return delay(100).then(function() {
    return input + 10;
  });
}

justTesting(29).then(function(val) {
  // you access the value from the promise here
  log(val);
});

// display output in snippet
function log(x) {
  document.write(x);
}


2
是什么引发我离开是双重return的,即justTestingreturn.then => return。我知道我已经实现了此功能,而bcs却使我实现了这个功能(lints迫使我离开了new Promise),但是您能解释一下如何理解/考虑那个收益/收益对吗?
罗尼·罗斯顿

2
@RonRoyston-首先,传递给您的函数.then()是一个与包含函数分离的函数,因此在调用时,它具有自己的返回值。其次,.then()处理程序的返回值成为承诺的已解决值。因此,.then(val => {return 2*val;})将解析值从更改val2*val
jfriend00

13

我在这里所做的是,我已经从justTesting函数返回了诺言。函数解析后即可得到结果。

// new answer

function justTesting() {
  return new Promise((resolve, reject) => {
    if (true) {
      return resolve("testing");
    } else {
      return reject("promise failed");
   }
 });
}

justTesting()
  .then(res => {
     let test = res;
     // do something with the output :)
  })
  .catch(err => {
    console.log(err);
  });

希望这可以帮助!

// old answer

function justTesting() {
  return promise.then(function(output) {
    return output + 1;
  });
}

justTesting().then((res) => {
     var test = res;
    // do something with the output :)
    }

如果在“ //对输出执行某些操作”中放入了return语句,会发生什么情况?例如:我将在父函数中包含“ JustTesting()。then ...”。我可以在“然后”部分中返回一个值吗?
mrzepka '17

如果您想通过//对输出执行某操作来返回一个值,则必须在justTesing()之前添加一个返回值。例如,“ return justTesting()。then((res)=> {return res;});
Vidur Singla

好了,这就是我所期望的,我只是想确保:)谢谢!
mrzepka '17

如果我们从那时返回测试怎么办?
MeVimalkumar

3

我更喜欢使用“ await”命令和异步函数来消除承诺的混乱,

在这种情况下,我将首先编写一个异步函数,它将代替该问题的“ promise.then”部分下调用的匿名函数使用:

async function SubFunction(output){

   // Call to database , returns a promise, like an Ajax call etc :

   const response = await axios.get( GetApiHost() + '/api/some_endpoint')

   // Return :
   return response;

}

然后从主函数调用此函数:

async function justTesting() {
   const lv_result = await SubFunction(output);

   return lv_result + 1;
}

注意我在这里将主函数和子函数都返回给异步函数。


是的...使用await可以使它更清洁并解决了问题
karthikeyan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.