2016-02-25 2 views
0

Я получаю все больше и больше с библиотекой asyncawait.Asyncawait.js несколько аргументов в обратном вызове

Если я правильно, это:

var doSth = async function() { 
    var asyncResult = await promiseReturningFunction(); 
    subFunction(asyncResult); 
}; 

эквивалентно:

var doSth = function() { 
    promiseReturningFunction().then(function(asyncResult) { 
    subFunction(asyncResult); 
    }); 
}; 

Но что, если обратный вызов имеет два аргумента .then(function(asyncResult1, asyncResult2) {})?

В некоторых других языках, я бы написать:

var asyncResult1, asyncResult2 = await promiseReturningFunction(); 

но я не могу это сделать в JS, я могу? Ожидает ли возвращает массив? Первый аргумент?

+1

Библиотека asyncawait и предстоящий 'async/await' - это две разные вещи. Они могут работать очень схожим образом, но вы должны уточнить, о ком вы говорите. Даже если вы связываетесь с библиотекой, ваш пример, похоже, не использует библиотеку. –

+0

Вы используете экспериментальный транспилер async/wait или библиотеку на основе волокон? – Bergi

ответ

3

Я не могу сделать это в JS, не так ли?

Нет, вы не можете. Обещания выполняются только с одним значением.

В JavaScript нет кортежей, но для этого вы можете использовать массив. С деструктуризации, вы можете сделать это выглядит почти как в этих других языках:

async function promiseReturningFunction() { 
    await …; 
    … 
    return [result1, result2]; 
} 

// elsewhere (in an async function): 
var [asyncResult1, asyncResult2] = await promiseReturningFunction(); 
0

Обещания могут передавать только один аргумент для обратного вызова выполнения. As Benjamin Gruenbaum writes:

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

(Here is the section in the Promises/A+ specification)

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

1

Вы можете легко использовать destructuring на кучу обещаний вроде этого:

var [r1, r2, r3] = await Promise.all([p1, p2, p3]); 

или

var promises = [p1(), p2(), p3()]; 
$q.all(promises) 
    .then(function ([p1Result, p2Result, p3Result]) { 
     // ... 
    }); 

Таким образом, у вас будет:

async function doSth() { 
    var [asyncResult1, asyncResult1] = await promiseReturningFunction(); 
    var asyncLastResult = await subFunction(asyncResult1); 

    return asyncLastResult; 
} 

doSth(); 
Смежные вопросы