我正在尝试使用延迟学习,因为我没有在“then”块中得到预期的参数,所以我发现了。
var makeCall = function (err, param) {
var deferred = Q.defer();
setTimeout(function() {
console.log(1111, err, param);
deferred.resolve(err, param);
}, 1000);
return deferred.promise;
};
makeCall('test', '11').then(function(err, data) {
console.log(222, err, data);
});
控制台。 1111输出从Ajax调用返回的正确数据,但222没有。
答案 0 :(得分:5)
deferred.resolve
只能接受一个参数,即标记异步调用的成功。要通知失败,您需要使用deferred.reject
。所以你的代码必须像这样改变
var makeCall = function(err,param){
setTimeout(function () {
console.log(1111, err, param);
var deferred = Q.defer();
if (err) {
deferred.reject(err);
} else {
deferred.resolve(param);
}
}, 1000);
return deferred.promise;
};
makeCall(undefined, '11').then(function (data) {
console.log(222, data);
}, function (err) {
console.log(333, err);
});
这将打印222 '11'
,以模拟失败案例,只需以任何Truthy值作为第一个参数调用makeCall
,例如
makeCall('11')....
它将调用失败处理程序,输出将为333 '11'
。
答案 1 :(得分:2)
在你的情况下,我完全避免延期。
var makeCall = function(err,param){
if(err) return Q.reject(err);
return Q(param).delay(1000);
};
(fiddle)
用法类似于之前的thefoureye的答案,因为promises就像同步代码,你使用返回值和catch语句与它们交互。 Nodebacks((err,data)
)和回调通常会从异步代码中删除许多所需的属性,并且承诺旨在恢复这些属性。
makeCall(new Error("Hello"),"SomeValue").then(function(cata){
console.log("Got correct data!",data);
}).catch(function(err){
console.log("Got error :(",err); // this would happen since we passed an error.
});
我还假设这个函数是虚构的,并不代表真正的API。
在将API转换为promises时,您主要使用延迟对象,在这种情况下您不需要这样做。
答案 2 :(得分:1)
注意,a)不确定是否正确解释问题; b)Promise
在每个浏览器中都没有普遍实现,也没有在jsfiddle实现。这可能是有用的JavaScript承诺http://www.html5rocks.com/en/tutorials/es6/promises/(可以在console
处尝试下面的部分;也应该在每晚mozilla console
工作,它似乎实现Promise
对象)
试试这个(模式)
var makeCall = function(err, param) {
return new Promise(function(resolve, reject ) {
setTimeout(function() {
console.log(1111, err, param);
return (err && param) ?
resolve(err, param) :
reject(Error("error"))
})
}, 1000);
};
makeCall("test", "11")
.then(function(result) {
console.log(222, result);
makeCall("test2","11");
makeCall("abc", 123) // `chain` test
},
function(err) {
console.log(err)
});