2013-12-13 83 views
3

我通过致电then来创建承诺。
我可以以某种方式报告其内部的进展,还是我必须使用Q.defer(其中有notify)?我可以报告Q承诺进展而不创建延期?

var promise = doSomething().then(function() { 
    // somehow report progress from here 
}); 

promise.progress(function (p) { 
    console.log('progress', p); 
}); 

回答

0

我不完全相信你通过“创建通过调用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)); 

虽然我可能误解了你的问题。

+0

嗨,感谢您的回复。我添加了一个代码示例。我知道我可以使用任意回调,但是我想知道是否可以让Q的'promise'处理程序在不使用'Q.defer'的情况下工作。 –

1

使用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 
});