Javascript 非异步承诺回调
在Javascript 非异步承诺回调,javascript,promise,q,Javascript,Promise,Q,在非PromisifiedAPI完成其异步工作后,如果依次调用bar和bam,此代码是否会按预期工作?是,它将按预期工作q通过在一元API中无声地包装它们,按顺序处理非预期的同步函数。是的,它将按预期工作q通过在一元API中无声地包装它们,按顺序处理非预期的同步函数。是的,它将按预期工作q通过在一元API中无声地包装它们,按顺序处理非预期的同步函数。是的,它将按预期工作q通过在一元API中无声地包装它们,按顺序处理非预期的同步函数(正如预期的那样)。下面是一个代码片段,它向您展示了它的工作原理(
非PromisifiedAPI
完成其异步工作后,如果依次调用bar
和bam
,此代码是否会按预期工作?是,它将按预期工作q
通过在一元API中无声地包装它们,按顺序处理非预期的同步函数。是的,它将按预期工作q
通过在一元API中无声地包装它们,按顺序处理非预期的同步函数。是的,它将按预期工作q
通过在一元API中无声地包装它们,按顺序处理非预期的同步函数。是的,它将按预期工作q
通过在一元API中无声地包装它们,按顺序处理非预期的同步函数(正如预期的那样)。下面是一个代码片段,它向您展示了它的工作原理(使用我建议的语法)
函数日志(msg){document.body.innerHTML+=“”+msg+“”;}
函数nonPromisifiedApi(选项、失败、回调){
日志(“非Promisifiedapi”);
setTimeout(函数(){
回调(“非ROM的异步结果”);
},选项。时间);
}
函数异步(选项){
返回Q.Promise(函数(解析、拒绝){
非PromisifiedAPI(选项、拒绝、功能(val){
日志(“异步(val:+val+”);
解析(“异步的结果”);
});
});
}
功能同步1(val){
日志(“同步1(val:+val+”);
//过滤返回的值
返回“sync1的结果”;
}
功能同步2(val){
日志(“同步2(val:+val+”);
//无返回=>未定义
}
异步({time:1000})
。然后(同步1)
。然后(同步2)
.then(功能(val){
日志(“结束(val:+val+”)
});代码>
这里有一个代码片段向您展示了它的工作原理(使用我建议的语法)
函数日志(msg){document.body.innerHTML+=“”+msg+“”;}
函数nonPromisifiedApi(选项、失败、回调){
日志(“非Promisifiedapi”);
setTimeout(函数(){
回调(“非ROM的异步结果”);
},选项。时间);
}
函数异步(选项){
返回Q.Promise(函数(解析、拒绝){
非PromisifiedAPI(选项、拒绝、功能(val){
日志(“异步(val:+val+”);
解析(“异步的结果”);
});
});
}
功能同步1(val){
日志(“同步1(val:+val+”);
//过滤返回的值
返回“sync1的结果”;
}
功能同步2(val){
日志(“同步2(val:+val+”);
//无返回=>未定义
}
异步({time:1000})
。然后(同步1)
。然后(同步2)
.then(功能(val){
日志(“结束(val:+val+”)
});代码>
这里有一个代码片段向您展示了它的工作原理(使用我建议的语法)
函数日志(msg){document.body.innerHTML+=“”+msg+“”;}
函数nonPromisifiedApi(选项、失败、回调){
日志(“非Promisifiedapi”);
setTimeout(函数(){
回调(“非ROM的异步结果”);
},选项。时间);
}
函数异步(选项){
返回Q.Promise(函数(解析、拒绝){
非PromisifiedAPI(选项、拒绝、功能(val){
日志(“异步(val:+val+”);
解析(“异步的结果”);
});
});
}
功能同步1(val){
日志(“同步1(val:+val+”);
//过滤返回的值
返回“sync1的结果”;
}
功能同步2(val){
日志(“同步2(val:+val+”);
//无返回=>未定义
}
异步({time:1000})
。然后(同步1)
。然后(同步2)
.then(功能(val){
日志(“结束(val:+val+”)
});代码>
这里有一个代码片段向您展示了它的工作原理(使用我建议的语法)
函数日志(msg){document.body.innerHTML+=“”+msg+“”;}
函数nonPromisifiedApi(选项、失败、回调){
日志(“非Promisifiedapi”);
setTimeout(函数(){
回调(“非ROM的异步结果”);
},选项。时间);
}
函数异步(选项){
返回Q.Promise(函数(解析、拒绝){
非PromisifiedAPI(选项、拒绝、功能(val){
日志(“异步(val:+val+”);
解析(“异步的结果”);
});
});
}
功能同步1(val){
日志(“同步1(val:+val+”);
//过滤返回的值
返回“sync1的结果”;
}
功能同步2(val){
日志(“同步2(val:+val+”);
//无返回=>未定义
}
异步({time:1000})
。然后(同步1)
。然后(同步2)
.then(功能(val){
日志(“结束(val:+val+”)
});代码>
您测试过吗?看起来,bar
将执行-然后bam
将执行,但它们之间没有承诺。。因此,运行bam
时,不能保证bar
是完整的!你的评论“你测试过了吗”可以应用于本网站50%的评论。我刚刚测试了它,并将把我的发现添加到答案中。注释的其余部分显然是错误的。您的deferred.resolve
和deferred.reject
作为未绑定到实际延迟对象的函数传递。此外,bar和bam将一个接一个地执行,没有任何延迟,感谢您强调绑定问题。然而,考虑到它“有效”,我怀疑q是否为了方便而预先绑定了这些函数。另外,请注意,延迟的使用是不标准的,现在被认为是不好的做法。您可以考虑使用<代码> Q.Promise <代码> API。更好的是,您可以使用ES6 polyfill而不是Q
(例如)。这里有一篇关于承诺的好文章:。阅读它可能会回答你可能遇到的大部分问题。你测试过它吗?看起来,bar
将执行-然后bam
将执行,但它们之间没有承诺。。因此,运行bam
时,不能保证bar
是完整的!你的评论“你测试过了吗”可以应用于本网站50%的评论。我刚刚测试了它,并将把我的发现添加到答案中。这个
function foo(options) {
var deferred = q.defer();
nonPromisifiedApi(options, deferred.resolve, deferred.reject);
return deferred.promise;
}
function bar() {}
function bam() {}
foo({})
.then(bar)
.then(bam);