2017-01-24 2 views
5

У меня возникли проблемы с передачей параметров через цепочку обещаний, которую я установил. Вот основной пример того, что я пытаюсь сделать.Передача параметров в цепочку обещаний

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

Во втором обещании пользователь параметр не определен, как я могу передать несколько параметров через обещание цепь, так как эти обещания продолжать больше информации добавляется к цепочке, к концу этого я передаю 5 ценности до последнего обещания.

Должен ли я просто использовать операторы ES6, чтобы объединить их в объект и деконструировать их при каждом вызове? например return resolve({request, user}), а затем const { request, user } = param

+0

Да, вы правы, 'resolve' и' reject' должны получать один параметр. –

+1

Не можете ли вы просто использовать '.then (request => printPassword (request, dummyUser))'? – Phil

+0

Обратите внимание, что вы не должны использовать обещания вообще, когда вы только синхронно разрешаете значение. – Bergi

ответ

6

Вы на правильном пути. Объекты Promise содержат единственное выполненное значение, которое передается обработчикам обработанных обработчиков. Значение обезличивания или исполняемое значение обещания, когда оно в конечном итоге выполняется, используется для выполнения следующего обещания в цепочке обещаний. Если вы хотите распространять несколько значений на следующий обработчик обещаний, вам нужно использовать одно значение объекта для этого.

Итак, давайте предположим, что printEmail и printPassword фактически выполняют что-то асинхронное, а не синхронные операции в сообщении.

printEmail становится:

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

без «возвращение» заявление внутри исполнителя нового Promise - возвращаемое значение из функции исполнителя не используется, и как правило, будет undefined.

printPassword становится

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

ли вы деконструировать объект данных в переменные или не стилистический, а не технический вопрос. Точно так же, передаете ли вы один и тот же объект нескольким обработчикам в цепочке обещаний, удаляя или добавляя свойства, если это необходимо, или создайте новый объект с только свойствами, необходимыми для следующих шагов, полностью зависит от выбора и стиля.

+0

Это то, что я сделал, спасибо. – Hobbyist

Смежные вопросы