2016-02-29 5 views
4

Я пытаюсь научиться использовать обещания, но у меня проблемы с пониманием цепочки. Я предполагаю, что с этим кодом обе обестится. Затем, когда я вызываю test.then(), он должен знать, что тест разрешил и передал данные разрешения then().JS ES6 Promise Chaining

Как только эта функция заканчивается, она переходит на следующую, затем(), повторяя тот же процесс с обещанием test2.

Однако я могу получить его только для распечатки результатов первого обещания, а не второго. Любые идеи, что здесь отсутствует?

var test = new Promise(function(resolve, reject){ 
    resolve('done1'); 
}); 

var test2 = new Promise(function(resolve, reject){ 
    resolve('done2'); 
}); 

test 
.then(function(data) { 
    console.log(data); 
}) 
.then(test2) 
.then(function(data) { 
    console.log(data); 
}); 
+1

Вы не должны передавать обещание 'then', а функцию обратного вызова. – Bergi

+0

В общем, вы собираетесь создавать функции, которые возвращают обещания, основанные на какой-то конкретной потребности или вступлении, а не только на назначение «нового» обещания переменной. Такой способ создания обещаний почти никогда не нужен, если вы не адаптируете какую-либо другую функцию асинхронного использования к обещаниям. Таким образом, более легитимный фиктивный случай может быть: var test2 = x => new Promise (function (res, rej) {resolve (x);}); потому что по крайней мере там вы моделируете функцию, которая что-то делает с данными. И что-то вроде .then (test2) может действительно работать/быть значимым. – Dtipson

ответ

9

Ваш первый вызов .then возвращается неопределенным, в то время как любой последующий .then ожидает возвращенного обещание. Таким образом, вы должны изменить свой код:

var test = new Promise(function(resolve, reject){ 
    resolve('done1'); 
}); 

var test2 = new Promise(function(resolve, reject){ 
    resolve('done2'); 
}); 

test 
.then(function(data) { 
    console.log(data); 
    return test2; 
}) 

.then(resultOfTest2 => doSomething) 
.then(function(data) { 
console.log(data); 
}); 
+1

спасибо. Я чувствую себя дураком за это, но, надеюсь, это помогает другим людям с одинаковой проблемой. – Elliot

3

Вам нужно вернуться в следующий обещание от then обратного вызова:

test.then(function(data) { 
    console.log(data); 
    return test2; 
}).then(function(data) { 
    console.log(data); 
}); 
2

вам нужно возвратить другое обещание (test2) в первом обещании (test1), чтобы обеспечить сцепление:

var test = new Promise(function(resolve, reject){ 
    resolve('done1'); 
}); 

var test2 = new Promise(function(resolve, reject){ 
    resolve('done2'); 
}); 

test 
.then(function(data) { 
    console.log(data); 
    return test2; 
}); 
0

Вы также можете хочу попробовать -

let test = new Promise(function(resolve, reject){ 
     resolve('done1'); 
    }); 

    let test2 = new Promise(function(resolve, reject){ 
     resolve('done2'); 
    }); 

    try { 
     let logOne = test(); 
     let logTwo = test2(); 
     console.log(logOne); 
     console.log(logTwo); 
    } catch(error) { 
     console.error(error); 
    } 

Таким образом, вы также можете правильно обрабатывать любые зависимости от обещаний. Например, если тест был основан на данных теста два, вы можете -

try { 
     let logOne = test(); 
     let logTwo = test2(logOne); 
     console.log(logOne); 
     console.log(logTwo); 
    } catch(error) { 
     console.error(error); 
    } 
Смежные вопросы