Последовательный вызов функций JS Promise
Есть JS код возвращающий Promise
function SignCreate(certSubjectName, dataToSign, id) {
//dataToSign = $("#DataToSignTxtBox").val();
certSubjectName = $("#cert_info #subject b").text().replace("CN=", "");
return new Promise(function (resolve, reject) {
cadesplugin.async_spawn(function* (args) {
try {
if (certSubjectName === "") {
alert("Не выбран сертификат");
return;
}
var oStore = yield cadesplugin.CreateObjectAsync("CAdESCOM.Store");
yield oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
var CertificatesObj = yield oStore.Certificates;
var oCertificates = yield CertificatesObj.Find(
CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
var Count = yield oCertificates.Count;
if (Count == 0) {
throw ("Certificate not found: " + args[0]);
}
var oCertificate = yield oCertificates.Item(1);
var oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
yield oSigner.propset_Certificate(oCertificate);
var oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
yield oSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY);
yield oSignedData.propset_Content(dataToSign);
var sSignedMessage = yield oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, true);
yield oStore.Close();
args[2](sSignedMessage);
Verify(sSignedMessage, dataToSign);
$("#SignatureTxtBox").html(sSignedMessage);
SendSigninData(sSignedMessage, id);
}
catch (e) {
args[3]("Failed to create signature. Error: " + cadesplugin.getLastError(err));
}
}, certSubjectName, dataToSign, resolve, reject);
});
}
Есть функция внутри которой вызывается этот SignCreate
$("#SignMcBtn").click(function () {
var checkeds = $(".checkedMC:checked");
for (var n = 0; n < checkeds.length; n++) {
var id = $(checkeds[n]).data("rbd");
$.ajax({
url: "SignCard",
async: false,
method: 'POST',
data: { Id: id },
success: function (html) {
if (id.length > 10 && html.length > 100) {
SignCreate(null, html, id);
if (checkSignStatusForCert(id)) {
$(checkeds[n]).parent().parent().hide();
$(checkeds[n]).prop('checked', false);
}
}
}
});
}
});
Мне необходимо сделать вызов checkSignStatusForCert(id) но только после окончания работы функции SignCreate(null, html, id);
При этом редактировать SignCreate нельзя
Как в данном случае решить проблему чтобы вызов checkSignStatusForCert(id) шел только после отработки SignCreate ?
Ответы (2 шт):
Автор решения: Aziz Umarov
→ Ссылка
Почитайте про промисы
Это будет так
$("#SignMcBtn").click(function () {
var checkeds = $(".checkedMC:checked");
for (var n = 0; n < checkeds.length; n++) {
var id = $(checkeds[n]).data("rbd");
$.ajax({
url: "SignCard",
async: false,
method: 'POST',
data: { Id: id },
success: function (html) {
if (id.length > 10 && html.length > 100) {
SignCreate(null, html, id).then( res => {
if (checkSignStatusForCert(id)) {
$(checkeds[n]).parent().parent().hide();
$(checkeds[n]).prop('checked', false);
}
}
)
}
}
});
}
});
Единственно не понятно этот участок
//тут что-то делаем
}, certSubjectName, dataToSign, resolve, reject);
Что это за участок и почему вы передаёте туда resolve, reject?
Автор решения: meine
→ Ссылка
function a() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('a');
resolve();
}, 3000);
});
}
function b() {
console.log('b');
}
a().then(() => b());