Javascript 如何从没有';不允许在不使用延迟API的情况下返回值?
几天前我问过,这让我想到了这一点 在这种情况下,我必须处理一个Javascript 如何从没有';不允许在不使用延迟API的情况下返回值?,javascript,node.js,promise,Javascript,Node.js,Promise,几天前我问过,这让我想到了这一点 在这种情况下,我必须处理一个setTimeout,它不允许返回值。谢天谢地,您可以通过使用内置的delay功能来解决这个问题(至少对于蓝鸟承诺来说是这样) 但是像吞咽这样的任务呢?还受到另一个问题的启发: 导出不会是“废话”,因为gulp任务是异步运行的。这可以通过承诺来解决 一种方法是使用延迟代码(来自): 根据他们的wiki,这实际上并不被认为是一种反模式,但我发现使用deferred非常令人沮丧。承认这一点似乎很重要,因为bluebird的API中甚至没有
setTimeout
,它不允许返回值。谢天谢地,您可以通过使用内置的delay
功能来解决这个问题(至少对于蓝鸟承诺来说是这样)
但是像吞咽这样的任务呢?还受到另一个问题的启发:
导出不会是“废话”,因为gulp任务是异步运行的。这可以通过承诺来解决
一种方法是使用延迟代码(来自):
根据他们的wiki,这实际上并不被认为是一种反模式,但我发现使用deferred
非常令人沮丧。承认这一点似乎很重要,因为bluebird的API中甚至没有.pending()
方法,这意味着即使我想这样做,我也无法真正做到这一点
但是,您不能这样做:
var stuff;
var myPromise = gulp.task('LoadYamlFiles', function() {
return new Promise(function(resolve, reject) {
// do stuff
stuff = 'blah';
resolve(stuff);
})
});
module.exports = { myPromise };
因为匿名函数的返回值不是myPromise
将包含的内容。这也会导致你在这里看到的问题
那么,您如何处理这些通常使用事实上不推荐的
延迟模式的情况呢?您将变量命名为myPromise
,这是第一个提示,无论=
的另一端是什么,它都应该是一个承诺。那么让我们从
var myPromise = new Promise((resolve, reject) => {
// todo
});
module.exports { myPromise };
现在,让我们来填写细节
var myPromise = new Promise((resolve, reject) => {
gulp.task('LoadYamlFiles', function() {
let stuff = 'blah';
resolve(stuff);
});
});
一点重构给我们
let myPromise = new Promise(resolve =>
gulp.task('LoadYamlFiles', () => resolve('blah')));
我确信这不是一个真正的用例,但它仍然可以应用
另见:
afaik,“deferred”在jQuery中只是作为一个特定的东西而不是作为一个概念被“弃用”。也就是说,您可以在回调外部做出承诺,并从回调内部解析它……我使用var wait=ms=>newpromise(resolve=>setTimeout(resolve,ms))我同意这一点,事实上我记得我以前做过几次。出于好奇,有没有一种方法可以不把整个任务包装在承诺中就完成它呢?但这正是承诺的含义。承诺是一种价值的代理,“我向你保证,一个价值(或一个错误)将在未来某个时候到达”。所以你基本上需要承诺包装。通常,最好将整个过程封装在一个函数中并调用它,允许您通过闭包将参数传递到Promise构造函数中?显然,该示例实际上不起作用,因为fiddle没有gulp,但它是有效的?不,第二个函数中的resolve()
来自哪里?阅读我链接的第一个问题/答案。感谢您今天的帮助。最后,我从上面接受了我破碎的想法,并制作了以下内容:。我不知道它会有多有用,但能为npm制作我的第一个模块真是太好了。谢谢你回答所有问题:D
var myPromise = new Promise((resolve, reject) => {
gulp.task('LoadYamlFiles', function() {
let stuff = 'blah';
resolve(stuff);
});
});
let myPromise = new Promise(resolve =>
gulp.task('LoadYamlFiles', () => resolve('blah')));