Я хочу выполнить обещание другим обещанием. Дело в том, что я действительно хочу получить доступ ко второму (еще ожидающему) второму обещанию, как только первое обещание будет выполнено. К сожалению, мне кажется, что я могу получить значение разрешения второго обещания только после того, как оба обещания будут выполнены.
Вот пример использования, который я имею в виду:
var picker = pickFile();
picker.then( // Wait for the user to pick a file.
function(downloadProgress) {
// The user picked a file. The file may not be available just yet (e.g.,
// if it has to be downloaded over the network) but we can already ask
// the user some more questions while the file is being obtained in the
// background.
...do some more user interaction...
return downloadProgress;
}
).then( // Wait for the download (if any) to complete.
function(file) {
// Do something with the file.
}
)
Функция pickFile
отображает средство выбора файлов, в котором пользователь может выбрать файл либо со своего жесткого диска, либо с URL-адреса. Он возвращает обещание picker
, которое выполняется, как только пользователь выбрал файл. На этом этапе нам все еще может потребоваться загрузить выбранный файл по сети. Следовательно, я не могу выполнить picker
с выбранным файлом в качестве значения разрешения. Вместо этого picker
следует выполнить с другим обещанием, downloadProgress
, которое, в свою очередь, в конечном итоге будет выполнено с выбранным файлом.
Для полноты, вот имитация реализации функции pickFile
:
function pickFile() {
...display the file picker...
var resolveP1 = null;
var p1 = new Promise(
function(resolve, reject) {
resolveP1 = resolve;
}
);
// Mock code to pretend the user picked a file
window.setTimeout(function() {
var p2 = Promise.resolve('thefile');
resolveP1(p2); // <--- PROBLEM: I actually want to *fulfill* p1 with p2
}, 3000);
return p1;
}
Проблема в отмеченной строке заключается в том, что я хотел бы выполнить обещание p1
с помощью нового обещания p2
, но я знаю только, как разрешить его. разница между выполнением и разрешением заключается в том, что при разрешении сначала проверяется, предоставленное значение p2
снова является обещанием. Если это так, то выполнение p1
будет отложено до выполнения p2
, а затем p1
будет выполняться со значением разрешения p2
вместо самого p2
.
Я мог бы обойти эту проблему, построив оболочку вокруг p2
, т.е. заменив строку
resolveP1(p2); // <--- PROBLEM: I actually want to *fulfill* p1 with p2
из второго примера кода
resolveP1({promise: p2});
Затем в первом примере кода мне пришлось бы заменить строку
return downloadProgress;
by
return downloadProgress.promise;
Но это похоже на хитрость, когда все, что я действительно хочу сделать, это просто выполнить (а не разрешить) обещание.
Буду признателен за любые предложения.
result
изначально с именем файла или другими данными, а затем с наличием там.file
функции или свойства, которое разрешается при загрузке? - person loganfsmyth   schedule 23.08.2015<input type="file">
. Вместо этогоpickFile
отображает<form>
с некоторыми полями ввода для выбора файла (локально или по URL-адресу) и кнопкой продолжения. Таким образом, синхронизацияpickFile
остановит браузер, и пользователь не сможет взаимодействовать с элементами формы. В качестве альтернативы, возврат одного обещания отpickFile
, которое выполняется только после завершения загрузки, будет означать, что пользователю пришлось ждать загрузки, даже если файл не нужен немедленно. - person robamler   schedule 24.08.2015pickFile
)? Затем первое обещание (picker
) должно быть разрешено с помощью некоторого объекта, который содержит всю информацию, необходимую для инициирования загрузки, и основной код должен будет знать о реализации средства выбора файлов (например, он должен будет обновить индикатор выполнения в средстве выбора файлов, ...). Конечно, это возможно, но это создает множество зависимостей. Или я неправильно понял ваше предложение? - person robamler   schedule 24.08.2015.then
, и это приведет к замене исходного обещания возвращенным обещанием. Кстати, термин «решимость» обычно означает либо выполнение, либо отказ. - person   schedule 29.08.2015then()
, даже если методthen()
не совпадает сthen()
Promise
и объект не предназначен дляPromise
. Попытка решить с его помощью приводит к вызовуthen()
метода. - person interfect   schedule 05.04.2018