2017-01-24 23 views
5

Tôi đang gặp một số vấn đề khi truyền tham số thông qua chuỗi lời hứa mà tôi đã thiết lập. Đây là một ví dụ cơ bản về những gì tôi đang cố gắng làm.Truyền tham số cho chuỗi lời hứa

var dummyReq = { client: null }; 
var dummyUser = { email: '[email protected]', password: 'admin' }; 

function printEmail(request, user) { 
    return new Promise((resolve, reject) => { 
     console.log('Email:', user.email); 
     return resolve(request, user); 
    }); 
} 

function printPassword(request, user) { 
    return new Promise((resolve, reject) => { 
     console.log('Password:', user.password); // <-- user is undefined 
     return resolve(request, user); 
    }); 
} 

printEmail(dummyReq, dummyUser) 
    .then(printPassword) 
    .catch(function(error) { 
    console.log('Unexepected error has occured'); 
}); 

Trong lời hứa thứ hai người dùng tham số là undefined, làm thế nào tôi có thể vượt qua nhiều tham số thông qua một chuỗi lời hứa, vì đây là những lời hứa tiếp tục có thêm thông tin được thêm vào dây chuyền, bởi phần cuối của nó Tôi đang đi qua 5 giá trị thông qua lời hứa cuối cùng.

Tôi có nên sử dụng toán tử ES6 để kết hợp chúng thành đối tượng và giải mã chúng trên mọi cuộc gọi không? ví dụ: return resolve({request, user}) và sau đó const { request, user } = param

+0

có, bạn nói đúng, 'resolve' và' reject' sẽ nhận được một tham số. –

+1

Bạn không thể đơn giản sử dụng '.then (request => printPassword (request, dummyUser))'? – Phil

+0

Lưu ý rằng bạn không nên sử dụng lời hứa ở tất cả khi bạn chỉ giải quyết đồng bộ với một giá trị. – Bergi

Trả lời

6

Bạn đang đi đúng hướng. Các đối tượng hứa hẹn chứa một giá trị được thực hiện duy nhất được chuyển tới các trình xử lý phản ứng tích cực. Một giá trị không hứa hẹn, hoặc giá trị hoàn thành của một lời hứa khi nó cuối cùng trở thành hoàn thành, được sử dụng để thực hiện lời hứa tiếp theo trong một chuỗi các lời hứa. Nếu bạn muốn truyền nhiều giá trị cho trình xử lý lời hứa tiếp theo, bạn phải sử dụng một giá trị đối tượng đơn để làm như vậy.

Vì vậy, giả sử rằng printEmailprintPassword thực sự làm điều gì đó không đồng bộ thay vì các hoạt động đồng bộ trong bài đăng.

printEmail trở thành:

function printEmail(request, user) { 
    return new Promise((resolve, reject) => { 
     console.log('Email:', user.email); 
     resolve({request, user}); 
    }); 
} 

mà không có một "trở lại" tuyên bố bên trong thi hành di chúc của Promise mới - giá trị trả về của một chức năng thi hành di chúc không được sử dụng và nói chung sẽ được undefined.

printPassword trở thành

function printPassword(data) { 
    return new Promise((resolve, reject) => { 
     console.log('Password:', data.user.password); 
     resolve(data); 
    }); 
}} 

Cho dù bạn giải cấu trúc một đối tượng dữ liệu vào biến hoặc không phải là một phong cách chứ không phải là câu hỏi kỹ thuật. Tương tự, cho dù bạn chuyển cùng một đối tượng xuống nhiều bộ xử lý trong chuỗi lời hứa, xóa hoặc thêm thuộc tính nếu cần hoặc tạo đối tượng mới chỉ với các thuộc tính cần thiết trong các bước sau đây hoàn toàn là vấn đề lựa chọn và kiểu dáng.

+0

Đây là những gì tôi đã kết thúc, cảm ơn bạn. – Hobbyist

Các vấn đề liên quan