[编辑:因为这是一个基本问题,需要基本答案,
。有关更完整的信息,请按照"复制" link或评论中提供的this helpful example
我最近学会了如何使用promises,我很高兴,因为现在我可以避免异步代码中的回调:
asyncFunction1()
.then(asyncFunction2)
.then(asyncFunction3)
.catch( (err) => {/*handle*/} );

但我仅限于使用这些异步函数。现在我想在需要时创建自己的异步函数:
myCustomAsyncFunction()
.then(asyncFunction1) // asyncFunction1 expects a String parameter : "customResult"
.catch( (err) => {/*handle*/} );
function myCustomAsyncFunction() {
// do an async operation
// and when finished :
return("customResult");
}

上一个代码段导致错误:myCustomAsyncFunction
没有附加属性.then()
。
问题:如何正确有效地将我的功能作为"承诺链的一部分" ?
在promise世界中,异步函数返回一个promise,而不是你想到的customResult
。
如果您不知道延迟对象及其附属承诺是什么,可以找到一个解释承诺原则的好视频here。
现在,让我们假设你已经掌握了基本概念。如果我们希望我们的customFunction
返回一个承诺,我们必须在this good tutorial之后构建它:
var myCustomPromise = new Promise(function(resolve, reject) {
// the async code of myCustomFunction
if (/* everything turned out fine */) {
resolve("someResult");
}
else {
reject(Error("someError"));
}
});

新的promise将立即运行您指定为参数的匿名函数。承诺对象将等待"等待"匿名函数可以调用resolve
或reject
。这两个函数是触发器:
resolve("someResult")
,则会触发附加到promise的任何.then(),并将"someResult"
作为传递链的值。reject(Error("someError"))
,则.catch()会触发...... 好吧,这很有趣,但声明一个新的承诺会立即触发我的异步代码。如果我想随意解雇它,我必须在函数中包含以上所有内容:
function myCustomFunction() {
return new Promise( function(resolve, reject) {
// the async code of myCustomFunction
if (/* everything turned out fine */) {
resolve("someResult");
}
else {
reject(Error("someError"));
}
});
}

以下是此代码的预期事件链:
myCustomFunction
将立即返回一个新的待决承诺。 resolve()
或reject()
。