Важные вещи, чтобы понять здесь
then
и catch
возвращают новые объекты обещания. then
и catch
возвращают новые объекты обещания, они могут быть привязаны. then
или catch
), он будет обрабатываться в следующем обработчике отклонения по пути цепочки. then
и catch
не выполняются синхронно. Когда обработчик бросает, он немедленно прекратится. Таким образом, стек будет размотан, и исключение будет потеряно. Вот почему бросание исключения отвергает текущее обещание. В вашем случае вы отклоняете внутри do1
, бросая объект Error
. Теперь текущее обещание будет в состоянии отклонения, и управление будет передано следующему обработчику, который в нашем случае then
.
Поскольку обработчик then
не имеет обработчика отклонения , do2
не будет выполняться вообще. Вы можете подтвердить это, используя console.log
внутри него. Поскольку текущее обещание не имеет обработчика отклонения, оно также будет отклонено с использованием значения отклонения от предыдущего обещания, и управление будет передано следующему обработчику, который является catch
.
Поскольку catch
является обработчиком отклонения, когда вы console.log(err.stack);
внутри него, вы можете видеть трассировку стека ошибок. Теперь вы выбрасываете из него объект Error
, так что обещание, возвращенное catch
, также будет находиться в состоянии отклонения.
Поскольку вы не привязали обработчик отклонения к catch
, вы неспособный наблюдать отклонение.
Вы можете разделить цепочку и понять это лучше, например
var promise = do1().then(do2);
var promise1 = promise.catch(function (err) {
console.log("Promise", promise);
throw err;
});
promise1.catch(function (err) {
console.log("Promise1", promise1);
});
. Вы получите то, что вы получите
Promise Promise { <rejected> [Error: do1] }
Promise1 Promise { <rejected> [Error: do1] }
Внутри обработчика catch
вы получаете значение promise
объекта как отклоненного.
То же самое, обещание, возвращаемое обработчиком catch
1, также отклоняется с той же ошибкой, с которой promise
был отклонен, и мы наблюдаем его во втором обработчике catch
.
Я думаю, что ошибка, сделанная предыдущими плакатами, заключалась в том, что читали документацию, а не смотрели на примеры.
Несколько часов назад мне нужно было связать некоторые классы C ++ с C #. Я заглянул в свой каталог Swig (он у меня уже был для другой работы), нашел каталог Примеры / csharp / class
, просмотрел код, загрузил решение, просмотрел его, скопировал, вставил в свой код, это сработало, моя работа была сделана.
С учетом сказанного, сгенерированный код P / Invoke не решение для любых нужд. В зависимости от вашего проекта, может быть так же просто написать несколько простых оболочек API самостоятельно или написать управляемый C ++ (превосходный пример этого можно найти в SlimDX).
Для моих нужд это было просто и легко - у меня был mystuff.dll
, а теперь я могу дополнительно отправить mystuffnet.dll
. Я согласен, что в документ трудно войти.
Edit: Я заметил, что OP упоминает только C. Для этого вам действительно не нужен Swig, просто используйте обычный синтаксис взаимодействия C # / C DLLImport . Swig становится полезным, когда вы хотите, чтобы классы C ++ вызывались из C #.
это было просто и легко - у меня был mystuff.dll
, а теперь я могу дополнительно отправить mystuffnet.dll
. Я согласен с тем, что в документ трудно попасть.
Edit: Я заметил, что OP упоминает только C. Для этого вам действительно не нужен Swig, просто используйте обычный синтаксис взаимодействия C # / C DLLImport . Swig становится полезным, когда вы хотите, чтобы классы C ++ вызывались из C #.
это было просто и легко - у меня был mystuff.dll
, а теперь я могу дополнительно отправить mystuffnet.dll
. Я согласен с тем, что в документ трудно попасть.
Edit: Я заметил, что OP упоминает только C. Для этого вам действительно не нужен Swig, просто используйте обычный синтаксис взаимодействия C # / C DLLImport . Swig становится полезным, когда вы хотите, чтобы классы C ++ вызывались из C #.
Я действительно пытался использовать БОЛЬШОЙ ГЛОТОК для обертывания C++ проекта для использования в.NET несколько лет назад.
я не стал очень далеким, поскольку это была обширная гигантская боль для создания конфигурации тот требуемый БОЛЬШОЙ ГЛОТОК. В то время, когда я просто хотел решение, для не изучения другого языка/API/и т.д. БОЛЬШОЙ ГЛОТОК может быть легче использовать эти дни, я не мог сказать Вам.
Мы закончили тем, что использовали Управляемый С++ для обертывания проекта C++. Это работало действительно хорошо.
, Если бы Вы просто вызываете функции прямо из dll, я предложил бы не волноваться ни об одном из вышеупомянутого и просто использовать P/Invoke
Для моего последнего проекта вот полный файл конфигурации C # SWIG:
%module mdProject
%{
#include "mdProject.h"
%}
Я скомпилировал его в SWIG с помощью:
swig -csharp -c++ -I../../Include mdProject.i
Это сгенерировало Project.cxx, который я скомпилировал и связал непосредственно с 'main' DLL, поэтому мне не понадобилась вторая 'вспомогательная' DLL C ++. SWIG также сгенерировал кучу файлов C #, которые я скомпилировал в .NET DLL. Другие мои оболочки (Java, PHP и т. Д.) Используют вспомогательную DLL.
Как упоминал @patrick, SWIG использует P / Invoke, поэтому, если у вас возникла проблема с этим, вам нужно будет найти другое решение.
] Если вы используете типы, которые отличаются от обычных (пустоты, структуры и т. Д.), Вам придется проделать некоторую дополнительную работу, чтобы все получилось правильно, но для среднего API, использующего int, char * и т. Д., Это нормально.