应该由Promise调用同步代码,然后创build一个新的Promise

我已经实现了一些代码,其中asynchronous代码后面跟着一些同步函数。 例如:

function processSomeAsyncData() { asyncFuncCall() .then(syncFunction) .catch(error); } 

如果我理解正确的then也是一个承诺。 那么我是否应该在同步代码中创build一个承诺?

 function syncFunction() { const p = new Promise (function (resolve, reject) { //Do some sync stuff ... resolve(data); } return p; } 

如果没有必要,如果发生错误,如何拒绝来自同步代码的承诺?

您不需要明确地创build新的承诺。 有一个更简单的方法。

这个例子是人为的,因为它永远不会失败,但重点是你不必创造一个承诺,你不必返回一个决心(val)。

 function syncFunction() { var j = "hi" if(j){ return j; } return new Error('i am an error'); } 

这将工作:

 asyncFunction() .then(syncFunction); 

但是如果你反其道而行:

 syncFunction() .then(asyncFunction); 

你将不得不将你的syncFunction定义为:

 function syncFunction() { var j = "hi" return new Promise((resolve, reject) => { if(j){ return resolve(j); } return reject('error'); }) } 

编辑:为了certificate你所有的非信徒,在这个家伙在你的电脑本地射击。 certificate你有这些可供select的选项。 🙂

 var Promise = require('bluebird'); function b(h) { if(h){ return h; } return Promise.resolve('hello from b'); } function a(z) { return new Promise((resolve, reject)=> { if(z){return resolve(z)}; return resolve('hello from a'); }) } a().then(b).then(x => console.log(x)).catch(e => console.log(e)); b().then(a).then(x => console.log(x)).catch(e => console.log(e)); 

这是可选的。

如果您从syncFunction返回一个承诺,那么您的原始承诺只有在新承诺解决后才能解决,而新承诺返回的任何值将传递到链中的下一个承诺。

如果您返回一个非Promise值,那么将传递到下一个链中。

要从syncFunction内部syncFunction ,只需抛出一个exception。

不可以。同步代码可能会调用同步函数,并且应该始终同步失败! 它们不需要以任何方式符合asynchronous调用者。 如果发生错误只是抛出一个错误。 尝试一下:

 var asyncFuncCall = () => Promise.resolve(); function syncFunction() { throw new Error("Fail"); } asyncFuncCall() .then(syncFunction) .catch(e => console.log("Caught: " + e.message));