2017-01-24 13 views
5

Mam pewne problemy z przekazywaniem parametrów przez łańcuch obietnic, który skonfigurowałem. Oto podstawowy przykład tego, co próbuję zrobić.Przekazywanie parametrów do łańcucha obietnic

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

W drugiej obietnicy użytkownik parametr jest niezdefiniowany, w jaki sposób można przekazać wiele parametrów poprzez łańcuch obietnica, jak te obietnice kontynuować więcej informacji zostanie dodany do łańcucha, do końca mnie to przechodzącej 5 wartości do ostatniej obietnicy.

Czy powinienem używać operatorów ES6 do łączenia ich w obiekty i dekonstruowania ich przy każdym wywołaniu? na przykład return resolve({request, user}), a następnie const { request, user } = param

+0

tak, masz rację, 'resolve' i' reject' powinny otrzymać jeden parametr. –

+1

Nie możesz po prostu użyć '.then (request => printPassword (request, dummyUser))'? – Phil

+0

Należy zauważyć, że nie należy w ogóle używać obietnic, gdy tylko synchronicznie rozwiązuje się z wartością. – Bergi

Odpowiedz

6

Jesteś na dobrej drodze. Obiecujące obiekty posiadają pojedynczą, spełnioną wartość, która jest przekazywana do właśnie wypełnionych procedur obsługi reakcji. Niespełniona obietnica wartość lub spełniona wartość obietnicy, gdy w końcu się spełnią, służy spełnieniu następnej obietnicy w łańcuchu obietnic. Jeśli chcesz propagować wiele wartości do następnej obietnicy, musisz użyć wartości pojedynczego obiektu, aby to zrobić.

Załóżmy, że printEmail i printPassword faktycznie wykonują raczej operacje asynchroniczne niż synchroniczne w poście.

printEmail staje:

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

bez „powrót” oświadczenie wewnątrz wykonawca nowej Obietnicy - wartość zwracana funkcji executora nie jest używany i będzie generalnie undefined.

printPassword staje

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

Czy dekonstrukcji obiektu danych do zmiennych lub nie jest stylistyczna zamiast kwestii technicznej. Podobnie to, czy przekazujesz ten sam obiekt do wielu procedur obsługi w łańcuchu obietnic, usuwając lub dodając właściwości, jeśli jest to wymagane, czy też tworzysz nowy obiekt z tylko właściwościami wymaganymi w kolejnych krokach, jest całkowicie kwestią wyboru i stylu.

+0

Tak właśnie zrobiłem, dziękuję. – Hobbyist

Powiązane problemy