应该由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));