Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.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 我可以报告Q promise进度而不创建延迟报告吗?_Javascript_Promise_Q - Fatal编程技术网

Javascript 我可以报告Q promise进度而不创建延迟报告吗?

Javascript 我可以报告Q promise进度而不创建延迟报告吗?,javascript,promise,q,Javascript,Promise,Q,我正在通过调用然后创建一个承诺 我可以从内部报告进度吗,还是必须使用Q.defer(它有notify) 我不太清楚你所说的“通过调用然后来创建承诺”是什么意思。我猜你的意思是,你在用一个定义好的词来回报一个承诺?即 var iAmAPromise=其他承诺。然后(doSomething); 如果是这种情况,那么您可以使用适当的通知将doSomething包装到回调函数中。一个有效的例子: var Q = require('q'); function resolver(deferred){

我正在通过调用
然后
创建一个承诺
我可以从内部报告进度吗,还是必须使用
Q.defer
(它有
notify


我不太清楚你所说的“通过调用
然后
来创建承诺”是什么意思。我猜你的意思是,你在用一个定义好的词来回报一个承诺?即


var iAmAPromise=其他承诺。然后(doSomething);

如果是这种情况,那么您可以使用适当的通知将
doSomething
包装到回调函数中。一个有效的例子:

var Q = require('q');

function resolver(deferred){
  return function(){
    deferred.resolve('return value from initial promise');
  }
}

function someOtherPromise( ms ) {
  var deferred = Q.defer();
  setTimeout( resolver(deferred) , ms );
  return deferred.promise;
}

function doSomething(data, cb){
  console.log('----- doing something with:', data);
  var val = "Did something with: " + data;
  cb(val);
}

function reportProgress(doSomething, notifierCb){
  notifierCb('waiting on it');
  return function(someOtherPromiseResponse){
    console.log('--- got promise response: ', someOtherPromiseResponse);
    notifierCb('got response',  someOtherPromiseResponse);
    console.log('--- do something with it');
    notifierCb('doing something with it');
    doSomething(someOtherPromiseResponse, function(val){
      notifierCb('done, result was:', val);
    });
  };
}

function notifier(update, detail){
  console.log('Notifier update:', update, detail||"");
}

function logError(err){
  console.log('ERROR:', err);
}

var iAmAPromise = someOtherPromise(1000).then(reportProgress(doSomething, notifier)).catch(logError);

console.log('  (Am I a Promise?)', Q.isPromise(iAmAPromise));

不过我可能误解了你的问题。

结果是:不,我不能

另请参见原因。

使用
deferred.notify()
已经有一段时间没有人问这个问题了

例如:

函数doSomething(){
var deferred=Q.deferred();
setTimeout(函数(){
延期。通知(10);
},500);
setTimeout(函数(){
延期通知(40);
},1500);
setTimeout(函数(){
延期通知(60);
},2500);
setTimeout(函数(){
延期通知(100);
延迟。解决();
},3500);
回报。承诺;
}
doSomething()
.那么(
函数(){
//成功
console.log('done');
},
功能(err){
//有一个错误,
},
职能(进展){
//我们在执行过程中会收到进度通知
控制台日志(进度);
});

你好,谢谢你的回复。我添加了一个代码示例。我知道我可以使用任意回调,但我想知道我是否可以在不使用
Q.defer
的情况下让Q的
promise
处理程序工作。
var Q = require('q');

function resolver(deferred){
  return function(){
    deferred.resolve('return value from initial promise');
  }
}

function someOtherPromise( ms ) {
  var deferred = Q.defer();
  setTimeout( resolver(deferred) , ms );
  return deferred.promise;
}

function doSomething(data, cb){
  console.log('----- doing something with:', data);
  var val = "Did something with: " + data;
  cb(val);
}

function reportProgress(doSomething, notifierCb){
  notifierCb('waiting on it');
  return function(someOtherPromiseResponse){
    console.log('--- got promise response: ', someOtherPromiseResponse);
    notifierCb('got response',  someOtherPromiseResponse);
    console.log('--- do something with it');
    notifierCb('doing something with it');
    doSomething(someOtherPromiseResponse, function(val){
      notifierCb('done, result was:', val);
    });
  };
}

function notifier(update, detail){
  console.log('Notifier update:', update, detail||"");
}

function logError(err){
  console.log('ERROR:', err);
}

var iAmAPromise = someOtherPromise(1000).then(reportProgress(doSomething, notifier)).catch(logError);

console.log('  (Am I a Promise?)', Q.isPromise(iAmAPromise));
var progress = 96;
deferred.notify(progress);