如何将参数传递给"然后"功能

时间:2014-05-24 14:10:41

标签: javascript promise deferred q

我正在尝试使用延迟学习,因为我没有在“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没有。

http://jsfiddle.net/M2V44/

3 个答案:

答案 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)
});