2015-10-02 16 views
65

lời hứa, chỉ ví dụPromises, vượt qua tham số bổ sung để sau đó chuỗi

var P = new Promise(function (resolve, reject) { 
    var a = 5; 
    if (a) { 
    setTimeout(function(){ 
     resolve(a); 
    }, 3000); 
    } else { 
    reject(a); 
    } 
}); 

Sau khi chúng tôi gọi thì phương pháp trên lời hứa:

P.then(doWork('text')); 

chức năng DoWork trông như thế này:

function doWork(data) { 
    return function(text) { 
    // sample function to console log 
    consoleToLog(data); 
    consoleToLog(b); 
    } 
} 

Làm cách nào để tránh hàm bên trong trong doWork, để truy cập dữ liệu từ tham số lời hứa và văn bản? nếu có thủ đoạn nào? cảm ơn.

+1

Tại sao ai đó cố ý từ bỏ ** cà ri **? Để sử dụng phương thức 'bind' ghê tởm? - cũng rất chậm. – ftor

+0

@ftor Tôi không hiểu bạn, bạn có thể vui lòng cung cấp một số mã để làm rõ không? – Roland

Trả lời

59

Bạn có thể sử dụng Function.prototype.bind để tạo ra một chức năng mới với một giá trị truyền cho đối số đầu tiên của nó, như thế này

P.then(doWork.bind(null, 'text')) 

và bạn có thể thay đổi doWork đến,

function doWork(text, data) { 
    consoleToLog(data); 
} 

Bây giờ, text sẽ trên thực tế 'text' trong doWorkdata sẽ là giá trị được giải quyết bằng Lời hứa.

Lưu ý: Hãy đảm bảo rằng bạn đính kèm trình xử lý từ chối vào chuỗi lời hứa của mình.


chương trình làm việc:Live copy on Babel's REPL

function doWork(text, data) { 
    console.log(text + data + text); 
} 

new Promise(function (resolve, reject) { 
    var a = 5; 
    if (a) { 
     setTimeout(function() { 
     resolve(a); 
     }, 3000); 
    } else { 
     reject(a); 
    } 
    }) 
    .then(doWork.bind(null, 'text')) 
    .catch(console.error); 
+0

cảm ơn, giúp, trước đó tôi thử doWork.call (this, 'text'), nhưng dữ liệu đã được thay thế bằng 'text' – user3110667

+1

'call' gọi một hàm tại chỗ,' bind' tạo một hàm mới, tuy nhiên cả hai chấp nhận một bối cảnh thực thi như là đối số đầu tiên của họ. – sdgluck

63

Có lẽ câu trả lời đơn giản nhất là:

P.then(function(data) { return doWork('text', data); }); 

Hoặc, vì đây được gắn thẻ ecmascript-6, sử dụng chức năng mũi tên:

P.then(data => doWork('text', data)); 

Tôi thấy điều này dễ đọc nhất và không quá nhiều để viết.

+3

Cảm ơn, sau này chỉ là đẹp so với những gì tôi nghĩ tôi phải làm. – JollyJoker

0

Lodash cung cấp một lựa chọn tốt cho chính xác điều này.

P.then(_.bind(doWork, 'myArgString', _)); 

//Say the promise was fulfilled with the string 'promiseResults' 

function doWork(text, data) { 
    console.log(text + " foo " + data); 
    //myArgString foo promiseResults 
} 

Hoặc, nếu bạn muốn chức năng thành công của bạn chỉ có một tham số (kết quả lời hứa hoàn thành), bạn có thể sử dụng nó theo cách này:

P.then(_.bind(doWork, {text: 'myArgString'})); 

function doWork(data) { 
    console.log(data + " foo " + this.text); 
    //promiseResults foo myArgString 
} 

này sẽ đính kèm text: 'myArgString' đến this ngữ cảnh trong hàm.

1

Sử dụng cà ri.

var P = new Promise(function (resolve, reject) { 
    var a = 5; 
    if (a) { 
     setTimeout(function(){ 
      resolve(a); 
     }, 3000); 
    } else { 
     reject(a); 
    } 
}); 

var curriedDoWork = function(text) { 
    return function(data) { 
     console.log(data + text); 
    } 
}; 

P.then(curriedDoWork('text')) 
.catch(
    //some error handling 
); 
Các vấn đề liên quan