我想使用promises,但我有一个回调API,格式如下:
window.onload; // set to callback
...
window.onload = function() {
};
Run Code Online (Sandbox Code Playgroud)
function request(onChangeHandler) {
...
}
request(function() {
// change happened
...
});
Run Code Online (Sandbox Code Playgroud)
function getStuff(dat, callback) {
...
}
getStuff("dataParam", function(err, data) {
...
})
Run Code Online (Sandbox Code Playgroud)
API;
API.one(function(err, data) {
API.two(function(err, data2) {
API.three(function(err, data3) {
...
});
});
});
Run Code Online (Sandbox Code Playgroud)
我已经开发了几年的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)
哪个代码更多,可读性更低.我没有在这里获得任何东西,它也不会突然神奇地"平坦".更不用说必须将事物转换为承诺.
那么,这里的承诺有什么大惊小怪?
有什么区别:
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return "bbb";
})
.then(function(result) {
console.log(result);
});Run Code Online (Sandbox Code Playgroud)
还有这个:
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return Promise.resolve("bbb");
})
.then(function(result) {
console.log(result);
});Run Code Online (Sandbox Code Playgroud)
我问我使用Angular和$ http服务与链接.then()有不同的行为.有点太多的代码因此首先是上面的例子.
我希望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'却没有 - 它返回一个值而不是?更多细节.
var p1 = new Promise (function (res, rej){
res(42);
}).then((result) => {return result;});
Run Code Online (Sandbox Code Playgroud)
**如果我有** return result,
这个承诺有没有解决?“已兑现的承诺”是什么意思?