我已经开发了几年的JavaScript,我根本不理解有关承诺的大惊小怪.
似乎我所做的只是改变:
api(function(result){
api2(function(result2){
api3(function(result3){
// do work
});
});
});
Run Code Online (Sandbox Code Playgroud)
无论如何,我可以使用像async这样的库,例如:
api().then(function(result){
api2().then(function(result2){
api3().then(function(result3){
// do work
});
});
});
Run Code Online (Sandbox Code Playgroud)
哪个代码更多,可读性更低.我没有在这里获得任何东西,它也不会突然神奇地"平坦".更不用说必须将事物转换为承诺.
那么,这里的承诺有什么大惊小怪?
延期,承诺和期货有什么区别?
这三者背后是否有普遍认可的理论?
我找到了一个使用promises的现有库,但它不使用bluebird.库函数不与所有的额外功能蓝鸟确实喜欢.map()或.tap().我如何将"正常"或"非蓝鸟"的承诺转换为蓝鸟承诺,蓝鸟提供的所有额外功能?
我尝试将现有的承诺包装起来Promise.promisify,Promise.resolve而且似乎都没有效果.
我习惯了Dojo的承诺,我可以做以下事情:
promise.isFulfilled();
promise.isResolved();
promise.isRejected();
Run Code Online (Sandbox Code Playgroud)
有没有办法确定ES6承诺是否得到满足,解决或拒绝?如果没有,有没有办法填写使用该功能Object.defineProperty(Promise.prototype, ...)?
Promise.any()和之间有什么区别Promise.race(),它们的用法有何不同?
来自MDN,
此外,与返回第一个已解决值的 Promise.race() 不同,此方法返回第一个已解析值。此方法将忽略所有被拒绝的承诺,直到第一个解决的承诺。
所以这让我想到了resolve和stable之间的区别。然后将我带到 MDN 承诺页面,然后将我带到状态和命运
定居不是一种状态,只是一种语言上的便利。
所以我们有Promise.any和Promise.race为了语言方便?即没有区别。这种平等的另一个例子是“命运未决的承诺必然是未决的”。和“如果一个承诺不是待定的,即如果它被实现或被拒绝,我们说它被解决了。”。
所以如果一个 promise 被解决了,它就不是未解决的,所以它不是挂起的。那么,如果它不是待定的,它就已经解决了。所以解决了===解决了。
我还不清楚调用解析器的resolve()和fulfill()之间的区别?我看到了很多功能和术语"解决承诺"和"履行承诺".
我什么时候应该使用它们?
WebDriverJS和Protractor本身完全基于承诺的概念:
WebDriverJS(以及Protractor)API完全是异步的.所有功能都返回承诺.WebDriverJS维护一个待处理的承诺队列,称为控制流,以保持执行的有序性.
并且,根据定义:
promise是一个表示值的对象,或者是值的最终计算.每个承诺都以挂起状态开始,可以使用值成功解析,也可以拒绝指定错误.
关于承诺拒绝的最后一部分是我不完全理解并且未在Protractor中处理过的事情.我们看到和编写的一种常见模式是使用then()并为成功解决的承诺提供功能:
element(by.css("#myid")).getAttribute("value").then(function (value) {
// do smth with the value
});
Run Code Online (Sandbox Code Playgroud)
问题:
是否有可能由任何Protractor/WebDriverJS函数返回的承诺无法成功解决并被拒绝?我们真的应该担心并处理它吗?
我希望promise处理程序能够记录promise p1(而不是值"A"),因为直接console.log调用它p1.但是,它以某种方式记录"A".承诺如何在p1没有被调用的情况下自动解析为"A"?例如,console.log(p1)不按预期直接输出"A".幕后会发生什么事吗?
var p1 = new Promise(function(resolve, reject) {
resolve("A");
});
var p2 = new Promise(function(resolve, reject) {
resolve(p1);
});
p2.then(function(v) {
console.log(v)
});Run Code Online (Sandbox Code Playgroud)
编辑:我明白,打电话
p1.then((v) => return v))
Run Code Online (Sandbox Code Playgroud)
返回一个用值v实现的新promise.除非我在这里严重遗漏了某些东西,否则第二个promise构造函数中的"p1"引用应该直接传递给console.log,从而产生块
var p2 = new Promise(function(resolve, reject) {
resolve(p1);
});
p2.then(function(v) {
console.log(v)
});
Run Code Online (Sandbox Code Playgroud)
变得
console.log(p1).
Run Code Online (Sandbox Code Playgroud)
由于使用p1直接调用console.log,而不是p1.then(...)的结果,因此p1不应该像打印另一个程序一样解析为值"A"
var promise = new Promise(function(resolve, reject) {
resolve("B")
})
console.log(promise)
Run Code Online (Sandbox Code Playgroud)
不会产生字符串"B".
编辑2:我有一种误解,认为传递给执行程序的resolve参数是未实现函数的包装器,这引起了大量的混淆.检查为什么Promise构造函数需要一个在完成时调用'resolve'的函数,但'then'却没有 - 它返回一个值而不是?更多细节.
我看过很多实现,它们看起来都很不一样,我无法真正提炼出承诺的本质.
如果我不得不猜测它只是一个在回调触发时运行的函数.
有人可以在几行代码中实现最基本的承诺.
例如,从这个答案
片段1
var a1 = getPromiseForAjaxResult(ressource1url);
a1.then(function(res) {
append(res);
return a2;
});
Run Code Online (Sandbox Code Playgroud)
如何传递函数以then了解何时运行.
也就是说,它如何传递回ajax在完成时触发的回调代码.
片段2
// generic ajax call with configuration information and callback function
ajax(config_info, function() {
// ajax completed, callback is firing.
});
Run Code Online (Sandbox Code Playgroud)
这两个片段有何关联?
猜测:
// how to implement this
(function () {
var publik = {};
_private;
publik.then = function(func){
_private = func;
};
publik.getPromise = function(func){
// ??
};
// ??
}())
Run Code Online (Sandbox Code Playgroud) 我理解Promise存在于以下三种状态之一:Promise可以是待处理(未解析),履行(成功解决)或拒绝(解决失败).
阅读A + Promise Spec和MDN的文档,我很困惑他们都承认已完成和被拒绝的状态,但在Promise构造函数的定义中,他们指定了两个回调:resolve和reject.我们似乎可以互换地使用这两个术语; 他们不是.
并不意味着成功:
re·solve /r??zälv/ verb
1. settle or find a solution to (a problem, dispute, or contentious matter).
Run Code Online (Sandbox Code Playgroud)
是否意味着成功:
ful·fill /fo?ol?fil/ verb
1. bring to completion or reality; achieve or realize (something desired, promised, or predicted).
2. carry out (a task, duty, or role) as required, pledged, or expected.
Run Code Online (Sandbox Code Playgroud)
当我们真正实现承诺时,为什么我们在这里使用决心?有没有在其中的价值,我们通过一个实例解决可能会导致无极是拒绝 …
javascript ×10
promise ×9
bluebird ×2
q ×2
asynchronous ×1
callback ×1
deferred ×1
ecmascript-6 ×1
es6-promise ×1
future ×1
node.js ×1
protractor ×1
selenium ×1
testing ×1