2014-05-24 21 views
5

Tôi đang cố gắng tìm hiểu bằng cách sử dụng trì hoãn và tôi bị vấp ngã vì tôi không nhận được đối số dự kiến ​​trong khối "sau đó".Làm cách nào để chuyển đối số sang hàm "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); 
}); 

Bàn điều khiển. với 1111 kết quả đầu ra đúng dữ liệu được trả về từ một cuộc gọi Ajax nhưng 222 thì không.

http://jsfiddle.net/M2V44/

+0

là gì ' callEventSearch' và bạn đang gọi 'makeCall'? – thefourtheye

+0

Cuộc gọi tốt, cố định – Anatoli

+0

Thực ra tôi đang nhận cả hai '1111' và '222' – thefourtheye

Trả lời

5

deferred.resolve có thể chỉ chấp nhận một đối số và đó là để đánh dấu sự thành công của các cuộc gọi không đồng bộ. Để thông báo về sự thất bại, bạn cần sử dụng deferred.reject. Vì vậy, mã của bạn đã được thay đổi như thế này

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

này sẽ in 222 '11', để mô phỏng các trường hợp thất bại, chỉ cần gọi makeCall với bất kỳ giá trị Truthy như là đối số đầu tiên, ví dụ

makeCall('11').... 

nó sẽ gọi trình xử lý lỗi và đầu ra sẽ là 333 '11'.

2

Trong trường hợp của bạn, tôi sẽ tránh hoàn toàn trì hoãn.

var makeCall = function(err,param){ 
    if(err) return Q.reject(err); 
    return Q(param).delay(1000); 
}; 

(fiddle)

Việc sử dụng cũng tương tự như của thefoureye câu trả lời từ trước, vì lời hứa là như mã đồng bộ, bạn tương tác với chúng bằng giá trị trả về và tuyên bố bắt. Nodebacks ((err,data)) và callbacks thường loại bỏ nhiều thuộc tính mong muốn từ mã không đồng bộ và hứa hẹn nhằm khôi phục các thuộc tính đó.

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. 
}); 

Tôi cũng giả định rằng chức năng này là tưởng tượng và không đại diện cho một API thực.

Bạn chủ yếu sử dụng các đối tượng bị trì hoãn khi chuyển đổi API thành lời hứa, mà bạn không cần trong trường hợp này.

1

Lưu ý, a) Không nhất thiết nếu diễn giải Câu hỏi chính xác; b) Promise xuất hiện không được triển khai phổ biến trong mọi trình duyệt, cũng như tại jsfiddle. Đây có thể là Promises hữu ích JavaScript http://www.html5rocks.com/en/tutorials/es6/promises/ (nơi bên dưới mảnh có thể được xét xử tại console; cũng nên làm việc tại mozilla đêm console, xuất hiện để thực hiện Promise đối tượng)

Hãy thử điều này (mẫu)

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) 
}); 
Các vấn đề liên quan