Javascript 应该由Promise调用同步代码。然后创建一个新的Promise
我已经实现了一些代码,其中异步代码后面跟着一些同步函数。例如:Javascript 应该由Promise调用同步代码。然后创建一个新的Promise,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我已经实现了一些代码,其中异步代码后面跟着一些同步函数。例如: function processSomeAsyncData() { asyncFuncCall() .then(syncFunction) .catch(error); } 如果我理解正确,那么也是一种承诺。那么,我是否也应该在同步代码中创建承诺 function syncFunction() { const p = new Promise (function (resolve, reject) {
function processSomeAsyncData() {
asyncFuncCall()
.then(syncFunction)
.catch(error);
}
如果我理解正确,那么也是一种承诺。那么,我是否也应该在同步代码中创建承诺
function syncFunction() {
const p = new Promise (function (resolve, reject) {
//Do some sync stuff
...
resolve(data);
}
return p;
}
如果没有必要,那么在发生错误时,如何拒绝同步代码的承诺?这是可选的
如果从syncFunction
返回承诺,则只有在新承诺解析后,原始承诺才会解析,并且新承诺返回的任何值都将传递给链中的下一个然后
如果返回非承诺值,则该值将传递给链中的下一个,然后是
要从syncFunction
中拒绝,只需抛出一个异常。您不需要显式创建新承诺。有一个更简单的方法
这个示例是人为设计的,因为它永远不会失败,但关键是您不必创建承诺,也不必返回解析(val)
这将有助于:
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');
})
}
编辑:为了向所有非信徒证明这一点,请在您的计算机上本地给这家伙一次机会。证明您有这么多可用的选项。:)
不可以。同步函数可以从同步代码调用,并且应该始终同步失败!它们不需要以任何方式符合异步调用方。如果发生错误,就抛出一个错误。试试看:
var asyncFuncCall=()=>Promise.resolve();
函数syncFunction(){
抛出新错误(“失败”);
}
asyncFuncCall()
.then(同步功能)
.catch(e=>console.log(“catch:+e.message”)
在第二个示例中,不需要使用new Promise
,Promise.resolve
和Promise.reject
函数。在第一位代码中,返回承诺或值肯定不允许使用链接。然后,
。我正在计算机上进行本地快速测试以证明这一点。给我一点时间。:)@nils是的,从然后从处理程序返回非承诺值是完全有效的。请参阅:“从OnCompleted或onRejected回调函数返回的值将自动包装在已解析的承诺中”。同步函数应该抛出错误,而不是返回已拒绝的承诺!异常会在内部转换为拒绝。然后
仍会运行,因此永远不需要以这种方式容纳异步调用方。同步函数可以从同步代码调用,并且应该同步失败。封装规则。如果syncFunction
返回承诺,则应将其重命名为asyncffunction
。
function syncFunction() {
var j = "hi"
return new Promise((resolve, reject) => {
if(j){
return resolve(j);
}
return reject('error');
})
}
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));