Попытка использовать именованные функции в обещании Mongoose [duplicate]

Если все остальное не удается, перекомпилируйте.

Недавно я смог избавиться от нерешенной внешней ошибки в Visual Studio 2012, просто перекомпилировав нарушивший файл. Когда я перестроил, ошибка исчезла.

Это обычно происходит, когда две (или более) библиотеки имеют циклическую зависимость. Библиотека A пытается использовать символы в B.lib и библиотеке B пытается использовать символы из A.lib. Ничего не существует для начала. Когда вы пытаетесь скомпилировать A, шаг ссылки завершится неудачно, потому что он не может найти B.lib. A.lib будет сгенерирован, но не будет dll. Затем вы компилируете B, который будет успешным и сгенерирует B.lib. Повторная компиляция A теперь будет работать, потому что теперь найден B.lib.

17
задан Benjamin Gruenbaum 15 February 2014 в 18:25
поделиться

1 ответ

Правило большого пальца

Всякий раз, когда вы сомневаетесь в том, как что-то делать с обещаниями, подумайте об синхронной версии.

try{
   var result = myFn(param);
   // business logic with result
} catch(e) {
    //error handling logic
}

Это, по крайней мере, для меня выглядит лот чище, чем обратный вызов с первым параметром, который иногда null.

Метод обещаний почти всегда очень похож на синхронную версию проблемы:

myFn(param).then(function(result){
    // business logic with result
}).catch(function(e){
    //error handling logic
});

Где myFn будет выглядеть как при работе с обратными вызовами:

var myFn = function(param){
    return new Promise(function(resolve, reject){
        var calc = doSomeCalculation(param);
        if(calc === null) { // or some other way to detect error
            reject(new Error("error with calculation"), null);
        }
        someAsyncOp(calcN,function(err, finalResult){
            if(err) reject(err);
            resolve(finalResult);
        })
    });
};

Работа с callbacks / nodebacks

Это только то, что вам нужно делать при работе с обратными вызовами, при работе с обещаниями это намного проще, и вы можете сделать:

var myFn = function(param){
    var calc = doSomeCalculation(param);
    ...
    return someAsyncOp(calcN); // returning a promise.
}

Кроме того, при работе внутри цепей с обещаниями вы получаете защиту от бросков:

myFn(param).then(function(calcN){
   // here, you throw to raise an error and return to resolve
   // new Promise should be used only when starting a chain.
}).catch(function(err){
    // handle error
}).then(function(){
   // ready to go again, we're out of the catch
});

Обратите внимание, что некоторые библиотеки, такие как Bluebird , RSVP и Q предлагают синтаксический сахар и автоматическое обобщение методов, поэтому вам редко приходится использовать new Promise самостоятельно.

Кроме того, рассмотрите этот и , что , чтобы узнать больше об обработке ошибок обещаний.

32
ответ дан Benjamin Gruenbaum 26 August 2018 в 10:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: