如何在NodeJs中创建一个返回promise的函数?

时间:2016-08-01 14:50:04

标签: javascript node.js asynchronous promise

[编辑:因为这是一个基本问题,需要基本答案,

我在问题本身中添加了我自己的答案

。有关更完整的信息,请按照"复制" 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将立即运行您指定为参数的匿名函数。承诺对象将等待"等待"匿名函数可以调用resolvereject。这两个函数是触发器:

  • 如果您的代码调用了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"));
        }   
    }); 
}




以下是此代码的预期事件链:

  1. 每当被叫,myCustomFunction将立即返回一个新的待决承诺。
  2. 这个全新的待定承诺将立即触发您的异步代码。
  3. 在某些时候,您的异步代码应该调用resolve()reject()
  4. 这将使承诺成为最终状态和价值。
  5. 任何听取承诺的.then()或.catch()都知道该做什么!

0 个答案:

没有答案