Что происходит, когда мы используем «обратный вызов» в функции? и когда нам нужно его использовать?

Что происходит , когда мы используем " callback" в качестве ключевого слова в функции? И когда нам нужно его использовать? и что произойдет, если мы не используем его? Например, в следующем коде JavaScript:

function signPayment(recipient, amount, nonce, contractAddress, callback) {
  var hash = "0x" + ethereumjs.ABI.soliditySHA3(
    ["address", "uint256", "uint256", "address"],
    [recipient, amount, nonce, contractAddress]
  ).toString("hex");

  web3.personal.sign(hash, web3.eth.defaultAccount, callback);
}

Ответы (2)

Обратный вызов в основном представляет собой функцию, которая передается другой функции и выполняется там, когда вы вызываете этот «обратный вызов». Очень простой пример можно найти в документации Mozilla .
Если вы не передаете никакого обратного вызова, в зависимости от кода функции это может повлиять или не повлиять на вашу программу, поскольку обратный вызов будет нулевым.

Некоторые методы web3 являются асинхронными и требуют обратного вызова.

Функция обратного вызова выполняется после завершения исходной функции и принимает в качестве аргумента хэш транзакции или что-то подобное.

Вы можете полностью избежать обратных вызовов, используя шаблон async/await.

Например:

async function signPayment(recipient, amount, nonce, contractAddress) {
  var hash = "0x" + ethereumjs.ABI.soliditySHA3(
    ["address", "uint256", "uint256", "address"],
    [recipient, amount, nonce, contractAddress]
  ).toString("hex");

  var signed = await web3.personal.sign(hash, web3.eth.defaultAccount);
  console.log(signed);
}
@async @Maxpeinas Спасибо. Есть ли какие-либо преимущества для каждого из подходов: callbackпротив async? Спасибо
async по-прежнему выполняет обратный вызов под капотом, поэтому нет никакой разницы, за исключением того, что использование async упрощает ваш код.
Посмотрите это для сравнения между async/await и обратными вызовами: stackoverflow.com/questions/46336029/…
Спасибо. Просто мне нужно запустить этот код JavaScript, чтобы подписать платеж функцией signPayment (полный код здесь ) . Итак, я сохранил код JavaScript в .jsфайл (Содержимое этого .jsфайла можно посмотреть здесь .) Однако, когда я запускаю этот файл, node filename.jsя получаю сообщение об ошибке, что я загрузил снимок экрана Здесь . Я не знаю, где я иду не так. Еще раз спасибо.
@sas Ознакомьтесь с этим содержанием: gist.github.com/Kaisle/bece5cbdcac17385d2f8e0cfa7c6b095 . Просто замените аргументы аргументами из вашего кода (и игнорируйте аргумент обратного вызова, он вам не нужен)
Спасибо, теперь я получаю сообщение об ошибке, связанное с ethereumjs-abi. Вот содержимое файла, который я запускаю. И вот сообщение об ошибке, которое я получаю. Кстати, когда я хочу установить ethereumjs-abi, что используется в этом коде, я получаю это сообщение . Я не уверен, правильно ли он установлен. Спасибо
Вы включили зависимость в свой файл, используя require('ethereumjs-abi') или что-то подобное?
Спасибо, да, я забыл ... но теперь я добавил var abi = require('ethereumjs-abi')поверх кода ([ЗДЕСЬ] ( ibb.co/imjwPy )). Однако я получаю ту же ошибку ([ЗДЕСЬ]( ibb.co/bWvWrd )) Спасибо.
попробуйте следующее: var ethereumjs = require('ethereumjs-abi');
Хорошо, теперь он распознан .... но я получаю новую ошибку: [ЗДЕСЬ] ( ibb.co/jZbonJ ) ( soliditySHA3) Еще раз спасибо
попробуйте без ABI: ethereumjs.solidityShA3
Спасибо, решилась но новая...надеюсь последняя.... ТУТ ( sign) я тоже добавил Web3 = require("web3")и web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));еще раз спасибо
Я использовал web3.eth.personal.signвместо web3.personal.signи signрешил, но новая ошибка ЗДЕСЬ: ibb.co/gAG2gd Еще раз спасибо
это не из-за web3.eth.defaultAccount? Нам не нужно инициировать defaultAccountзначение? Спасибо