Promise.coroutine.addYieldHandler
Promise.coroutine.addYieldHandler(function handler) -> undefined
По умолчанию внутри сопрограмм можно передавать только Promises и Thenables. С помощью этой функции можно добавить поддержку передачи произвольных типов.
Например, если вы хотите, чтобы yield 500 было то же самое, что и yield Promise.delay:
Promise.coroutine.addYieldHandler(function(value) {
if (typeof value === "number") return Promise.delay(value);
});
Обработчики передачи вызовов вызываются, когда вы передаёте что-то, что по умолчанию не поддерживается. Будет использован первый обработчик передачи вызовов, вернувший promise или thenable. Если ни один обработчик не вернул promise или thenable, то генерируется ошибка.
Пример реализации поддержки обратных вызовов с addYieldHandler:
Это демонстрация возможностей данной функции, а не рекомендуемый способ использования. Для наилучшей производительности необходимо использовать promisifyAll и напрямую передавать promises.
var Promise = require("bluebird");
var fs = require("fs");
var _ = (function() {
var promise = null;
Promise.coroutine.addYieldHandler(function(v) {
if (v === undefined && promise != null) {
return promise;
}
promise = null;
});
return function() {
var def = Promise.defer();
promise = def.promise;
return def.callback;
};
})();
var readFileJSON = Promise.coroutine(function* (fileName) {
var contents = yield fs.readFile(fileName, "utf8", _());
return JSON.parse(contents);
});
Пример реализации поддержки thunks с addYieldHandler:
Это демонстрация возможностей данной функции, а не рекомендуемый способ использования. Для наилучшей производительности необходимо использовать promisifyAll и напрямую передавать promises.
var Promise = require("bluebird");
var fs = require("fs");
Promise.coroutine.addYieldHandler(function(v) {
if (typeof v === "function") {
return Promise.fromCallback(function(cb) {
v(cb);
});
}
});
var readFileThunk = function(fileName, encoding) {
return function(cb) {
return fs.readFile(fileName, encoding, cb);
};
};
var readFileJSON = Promise.coroutine(function* (fileName) {
var contents = yield readFileThunk(fileName, "utf8");
return JSON.parse(contents);
});
Пример обработки promises параллельно, добавив обработчик addYieldHandler для массивов :
var Promise = require("bluebird");
var fs = Promise.promisifyAll(require("fs"));
Promise.coroutine.addYieldHandler(function(yieldedValue) {
if (Array.isArray(yieldedValue)) return Promise.all(yieldedValue);
});
var readFiles = Promise.coroutine(function* (fileNames) {
return yield fileNames.map(function (fileName) {
return fs.readFileAsync(fileName, "utf8");
});
});
Пользовательский обработчик передачи вызовов также может быть использован только для одного вызова Promise.coroutine():
var Promise = require("bluebird");
var fs = Promise.promisifyAll(require("fs"));
var readFiles = Promise.coroutine(function* (fileNames) {
return yield fileNames.map(function (fileName) {
return fs.readFileAsync(fileName, "utf8");
});
}, {
yieldHandler: function(yieldedValue) {
if (Array.isArray(yieldedValue)) return Promise.all(yieldedValue);
}
});
© 2013–2018 Petka Antonov
Licensed under the MIT License.
http://bluebirdjs.com/docs/api/promise.coroutine.addyieldhandler.html