我已经开发了几年的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)
哪个代码更多,可读性更低.我没有在这里获得任何东西,它也不会突然神奇地"平坦".更不用说必须将事物转换为承诺.
那么,这里的承诺有什么大惊小怪?
我对被抛出的不同术语感到困惑.根据我的理解,承诺可以是:
fulfilled
rejected
pending
settled
resolved
defer
Run Code Online (Sandbox Code Playgroud)
解决意味着解决了吗?还是意味着它实现了?什么是推迟的?
我看过很多实现,它们看起来都很不一样,我无法真正提炼出承诺的本质.
如果我不得不猜测它只是一个在回调触发时运行的函数.
有人可以在几行代码中实现最基本的承诺.
例如,从这个答案
片段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) 我已经开始学习javascript承诺了.但我无法理解承诺的概念.最困扰我的是谁将Resolver和Reject函数传递给promise构造函数?
看到这个Promise的例子:
function getImage(url){
return new Promise(function(resolve, reject){
var img = new Image()
img.onload = function(){
resolve(url)
}
img.onerror = function(){
reject(url)
}
img.src = url
})
}
Run Code Online (Sandbox Code Playgroud)
现在谁通过解决方法并拒绝方法,因为我对javascript的理解告诉我,这个脚本会抛出未知的变量错误,因为解析和拒绝没有定义?
getImage('doggy.jpg').then(function(successurl){
document.getElementById('doggyplayground').innerHTML = '<img src="' + successurl + '" />'
}).catch(function(errorurl){
console.log('Error loading ' + errorurl)
})
Run Code Online (Sandbox Code Playgroud)
现在你看到一个像上面这样的方法,这些方法(解析和拒绝)传递的唯一方法是通过then和catch在上面的方法调用getImage中使用.