2016-09-14 48 views
0

雖然在使用回調函數 (沒有中斷函數的接口)之後試圖將代碼移動到promise中,但遇到了問題。 在這樣的代碼示例:承諾和nodebacks-節點中的錯誤返回promise.catch

function callMeWithCallback(args, next) { 
    Promise.resolve() 
    .then(()=> { 
     return next("some error will be thrown here"); 
    }).catch((error)=> { 
     return next("Error in callMeWithCallback func"); 
    }); 
} 

callMeWithCallback(args, function(){ 
    throw "some error"; 
}) 

發生什麼事是解決callMeWithCallback FUNC的承諾,並呼籲回調一次後,引發錯誤,代碼回來的抓在callMeWithCallback功能和來電再次回調。

我希望callMeWithCallback函數只能調用一次回調函數(我錯誤的情況下還是沒有)需要做什麼修改?

+1

['Promise.resolve'](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve)不是構造函數。 – Xotic750

+1

看看[.then(...).catch(...)'和'.then(...,...)'](http://stackoverflow.com/q/24662289/1048572) – Bergi

回答

1

我熱烈推薦你使用像bluebird庫,標準化這個給你 - 你的代碼是:

function callMeWithCallback(args, next) { 
    // in real code always reject with `Error` objects 
    var p = Promise.reject("some error will be thrown here"); 
    p.asCallback(next); // converts a promise API to a callback one, `throw`s. 
    return p; 
} 

這保證了「下一個」將最多調用一次。

如果你不想藍鳥,你可以自己實現: -

function asCallback(promise, callback) { 
    promise.then(v => callback(null, v), e => callback(e)); 
    } 

爲你保持通話在一個地方這將是罰款,只要。重要的部分是不要將呼叫分配給自己的「下一個」。

+0

謝謝@本傑明。 你的意思是'重要的部分是不把呼叫發送到下一個你自己'。如果asCallback函數在一個地方調用它? – yuria

+1

是的,確切地說。對不起,當時很急(我還是那種),並且不想讓你掛着沒有答案。 –