Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从没有';不允许在不使用延迟API的情况下返回值?_Javascript_Node.js_Promise - Fatal编程技术网

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))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')));