2016-05-13 137 views
0

之前,我想执行以下代码:等待一个承诺来解决函数返回一个值

exports.myFunction = function(){ 
    myPromise.doThis().then(ret => { 
    return ret; 
    }); 
} 

当调用这个函数返回undefined。如何让函数等待承诺解决然后返回。

+0

你不能。你只能自己给它一个回调函数,然后在'then'调用中调用回调函数,或者返回另一个约定 –

+1

在JavaScript中,在从函数返回之前,不能“等待”异步操作完成。它根本不会那样工作。相反,您返回承诺并让调用者使用'.then()'来知道结果何时准备就绪。 – jfriend00

+1

顺便说一句,'.then(ret => {return ret;});'(几乎)是空操作。 – 2016-05-13 04:31:04

回答

1

是异步的,不能保证知道什么时候解决承诺。它可能需要等待一段时间(取决于你在做什么)。

承诺后继续执行的典型方法是链接执行或使用回调函数。

作为回调

示例代码(我)建议使用一个回调。

exports.myFunction = function(callback){ 
    myPromise.doThis().then(ret => { 
     callback(ret); 
    }); 
} 

然后使用将类似于:

var myFunction = require('pathToFile').myFunction; 

myFunction(function(ret){ 
    //Do what's required with ret here 
}); 

编辑

正如@torazaburo提到的,函数可以浓缩成:

exports.myFunction = function(callback){ 
    myPromise.doThis().then(callback); 
} 

作为一个承诺

exports.myFunction = function(){ 
    //Returnes a promise 
    return myPromise.doThis(); 
} 

然后使用将类似于:

var myFunction = require('pathToFile').myFunction; 

myFunction().then(function(ret){ 
    //Do what's required with ret here 
}); 
+0

谢谢,这很有道理。 – Simar

+2

*完全解决*承诺不会解决一点点。它们要么没有解决,要么解决。此外,你的承诺和回调的混合是相当奇怪的。顺便说一句,'.then(ret => {callback(ret);})'(为什么不必要的大括号?)与说'.then(callback)'几乎相同。但是为什么编写一个函数,其唯一目的是进行异步调用并从调用指定的回调中挂起'then'?相反,让调用者自己指定'then'。 – 2016-05-13 04:35:00

+0

这是真的,他们或者解决或不。为了清楚起见,我将修改我的回复以删除此内容。 您也可以使用'callback'函数作为直接替换,删除不必要的'ret'赋值。我故意选择冗长的方法作为例子。简明的符号通常会让新开发人员感到困惑。 – AXRS