2015-08-25 2 views
0

Я попытался использовать функцию co и проверку на javascript, fulfill будет успешным возвратом, но reject нет, и ошибка catch не определена. и поток не может продолжаться. Зачем?Отклонить в обещании undefined

Ошибка:

> at GeneratorFunctionPrototype.next (native) 
    at onFulfilled (/Users/../project/app/node_modules/co/index.js:65:19) 
    at runMicrotasksCallback (node.js:337:7) 
    at process._tickDomainCallback (node.js:381:11) 

Код:

domain.run(function() { 

    var testPromise = function() { 
    return new Promise(function (fulfill, reject){ 
     //reject('error'); 
     reject(new Error('message')); 
    }); 
    }; 


co(function *() { 
    var d = yield testPromise(); 
    console.log(d); 
    res.send('fin'); 
}).catch(onerror); 
function onerror(error) { console.error(error.stack); } 

}); 
domain.on('error', function(error) { console.error(error); }); 
+0

Является ли сам аргумент 'reject' неопределенным? Или, может быть, потому, что вы передали строку 'reject()', которая не имеет свойства '.stack' (как указано ниже в вашем коде)? – greim

+0

Вы всегда должны передавать объект Error обработчику отклонения. Либо существующий объект ошибки, либо 'new Error ('blah blah')' – greim

+0

, если я удаляю 'catch', функция обещает по-прежнему то же самое, не может перейти к следующей функции – user1775888

ответ

5

catch error undefined

Нет, перехватывает ошибку 'error', значение, которое вы отвергнут с. Конечно, это не действительно Error, а строка, и поэтому она не имеет свойства .stack - вот почему она регистрирует undefined. Закрепить свой код, делая

reject(new Error('…')); 

Смотрите также Should a Promise.reject message be wrapped in Error?

the flow can't continue. why?

Ну, потому что у вас есть ошибка, и бросили exceptions сделать это поведение. Вы также захотите отправить ответ в обработчик ошибок!

co(function *() { 
    … 
}).catch(function onerror(error) { 
    console.error(error.stack); 
    res.send('err'); 
}); 

Или, если вы намерены продолжать поток на вызов, поместить в .catch handler прямо здесь:

co(function *() { 
    yield testPromise().then(function(d) { 
    console.log(d); 
    }).catch(function(error) { 
    console.error(error.stack); 
    }); 
    res.send('fin'); 
}); 

В качестве альтернативы, обернуть обещание вызова в Ьгу прилов:

co(function *() { 
    try { 
    var d = yield testPromise(); 
    console.log(d); 
    } catch(error) { 
    console.error(error.stack); 
    } 
    res.send('fin'); 
}); 
+0

Я редактирую, но моя проблема заключается в том, что функция не продолжает перемещаться в следующую, просто останавливается – user1775888

+0

, но я обертываю код' domain' уже – user1775888

+0

Итак? Домены также не продолжают поток. Я не знаю, где ваше заблуждение. – Bergi

Смежные вопросы