我通过致电then
来创建承诺。
我可以以某种方式报告其内部的进展,还是我必须使用Q.defer
(其中有notify
)?我可以报告Q承诺进展而不创建延期?
var promise = doSomething().then(function() {
// somehow report progress from here
});
promise.progress(function (p) {
console.log('progress', p);
});
我通过致电then
来创建承诺。
我可以以某种方式报告其内部的进展,还是我必须使用Q.defer
(其中有notify
)?我可以报告Q承诺进展而不创建延期?
var promise = doSomething().then(function() {
// somehow report progress from here
});
promise.progress(function (p) {
console.log('progress', p);
});
原来:不,我不能。
我不完全相信你通过“创建通过调用then
一个承诺”的意思。我猜你的意思是说你要回复一个承诺然后定义?即,
var iAmAPromise = someOtherPromise.then(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()
这已经有一段时间,因为这个问题已经被问,the Q
library now support it。
var progress = 96;
deferred.notify(progress);
例如:
function doSomething() {
var deferred = Q.defer();
setTimeout(function() {
deferred.notify(10);
},500);
setTimeout(function() {
deferred.notify(40);
},1500);
setTimeout(function() {
deferred.notify(60);
},2500);
setTimeout(function() {
deferred.notify(100);
deferred.resolve();
},3500);
return deferred.promise;
}
doSomething()
.then(
function() {
// Success
console.log('done');
},
function (err) {
// There was an error,
},
function (progress) {
// We get notified of the progress as it is executed
console.log(progress);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/q.js/1.4.1/q.js"></script>
进度通知
这是可能的承诺,报告他们的进步,例如对于需要很长时间才能上传文件的任务 。并非所有的承诺将 执行进度的通知,但对于那些做,你可以 消耗使用第三个参数则进度值:
return uploadFile() .then(function() { // Success uploading the file }, function (err) { // There was an error, and we get the reason for error }, function (progress) { // We get notified of the upload's progress as it is executed });
一样失败,Q还提供了一个名为 进展进度回调的简写:
return uploadFile().progress(function (progress) { // We get notified of the upload's progress });
嗨,感谢您的回复。我添加了一个代码示例。我知道我可以使用任意回调,但是我想知道是否可以让Q的'promise'处理程序在不使用'Q.defer'的情况下工作。 –